package uem.din.aeg.trab2.grafo;

import java.util.ArrayList;
import java.util.List;

public class Vertice implements Comparable<Vertice> {

    private int coordenadaX;
    private int coordenadaY;
    private String rotulo;
    private List<Vertice> adjacentes;
    private Double distanciaEstimada;
    private Vertice precedente;

    public Double getDistanciaEstimada() {
        return distanciaEstimada;
    }

    public void setDistanciaEstimada(Double distanciaEstimada) {
        this.distanciaEstimada = distanciaEstimada;
    }

    public Vertice getPrecedente() {
        return precedente;
    }

    public void setPrecedente(Vertice precedente) {
        this.precedente = precedente;
    }

    public List<Vertice> getAdjacentes() {
        return adjacentes;
    }

    public int getCoordenadaX() {
        return coordenadaX;
    }

    public int getCoordenadaY() {
        return coordenadaY;
    }

    public Vertice(int coordenadaX, int coordenadaY, String rotulo) {
        this.coordenadaX = coordenadaX;
        this.coordenadaY = coordenadaY;
        this.rotulo = rotulo;
        this.adjacentes = new ArrayList<Vertice>();
    }

    // usar este método apenas para vértices que sejam adjacentes
    public double distanciaAte(Vertice adjacente) {
        double distancia = Math.sqrt(
                Math.pow(this.coordenadaX - adjacente.coordenadaX, 2)
                + Math.pow(this.coordenadaY - adjacente.coordenadaY, 2));

        return distancia;
    }

    public void adicionaAdjacencia(Vertice outroVertice) {
        this.adjacentes.add(outroVertice);
    }

    @Override
    public String toString() {
        return rotulo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Vertice other = (Vertice) obj;
        if (this.coordenadaX != other.coordenadaX) {
            return false;
        }
        if (this.coordenadaY != other.coordenadaY) {
            return false;
        }
        if ((this.rotulo == null) ? (other.rotulo != null) : !this.rotulo.equals(other.rotulo)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;

    }

    @Override
    public int compareTo(Vertice o) {

        if (this.getDistanciaEstimada() < o.getDistanciaEstimada()) {
            return -1;
        } else if (this.getDistanciaEstimada() == o.getDistanciaEstimada()) {
            return 0;
        } else {
            return 1;
        }

    }
}
